/*
 * @Author: sjf 
 * @Date: 2021-12-07 14:11:55 
 * @Last Modified by: sjf
 * @Last Modified time: 2021-12-Tu 04:14:43
 */
import router from '../router/index'
import store from '../store/index'
import axios from 'axios'
import { message } from 'ant-design-vue';

//虽然给按钮添加了权限控制，但是为了防止他人通过控制台将禁用改为非禁用，所以在发送请求的时候，需要进行拦截处理
//先创建一个请求与权限的映射关系
const actionMapping = {
  get: 'view',
  post: 'add',
  put: 'edit',
  delete: 'delete'
}

//跨域代理前缀
// const API_PROXY_PREFIX = '/api'
// const REAL_URL = process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : API_PROXY_PREFIX
export function request (config) {
  //第二种配置方法
  const instance = axios.create({
    baseURL: '/api',
    timeout: 10000
  })
  //在vue.config.js中配置的时候需要这样配置
  // proxy: {
  //   //这里的'/'匹配的就是request中的baseUrl的端口后面的/，匹配到就执行下面的操作，进行代理
  //   '/api': {
  //     target: 'http://39.101.141.219:8888/',
  //       changeOrigin: true,  //是否开启跨域
  //         pathRewrite: {
  //       "^/api": ""  //查找开头为/api的字符替换成空字符串
  //     }
  //   }
  // },

  // 请求拦截  设置统一header
  instance.interceptors.request.use(config => {
    //如果token还没过期，请求的时候将token放入header里携带过去
    if (window.localStorage.getItem('NiuToken')) {
      config.headers.Authorization = window.localStorage.getItem('NiuToken')
      //当前模块中具备的权限
      //查看   get请求
      //增加   post请求
      //修改   put请求
      //删除   delete请求
      const method = config.method
      console.log(method)
      //根据请求得到是那种操作
      const action = actionMapping[method]
      //判断action是否存在当前路由的权限中
      const rights = store.state.user.role.rights
      if (rights && rights.indexOf(action) == -1) {
        return message.error("抱歉，您没有此操作权限")
      }
    }
    return config
  }, err => {
    return Promise.reject(err)
  })

  // 响应拦截  401 token过期处理
  instance.interceptors.response.use(res => {
    return res
  }, err => {
    console.log('***********')
    // console.log(err.response)
    //message.error(err.response.data)
    //取出响应的状态码
    const { status } = err.response
    if (status == 401) {
      message.error('登录已过期，请重新登录')
      // 清除token
      window.localStorage.removeItem('NiuToken')
      //清除其余保存在localstorage和vuex的信息
      window.localStorage.removeItem('currentSelectedMenu')
      window.localStorage.removeItem('defaultOpenMenu')
      store.dispatch('clearCurrentState')
      // 页面跳转
      router.replace('/login')
    }

    return Promise.reject(err)
  })

  return instance(config)
}
